package com.example.demo.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.ReturnData;
import com.example.demo.entity.TUser;
import com.example.demo.mapper.TUserMapper;
import com.example.demo.service.MyAsyncService;
import com.example.demo.service.TUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.utils.JWTUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author lands
 * @since 2024-11-05
 */
@Service
public class TUserServiceImpl extends ServiceImpl<TUserMapper, TUser> implements TUserService {
    @Autowired
    TUserMapper tUserMapper;
    @Override
    public List<TUser> getList() {
        return tUserMapper.selectList(new QueryWrapper<>());
    }
//    登录业务实现
    @Override
    public ReturnData login(TUser tUser) {

        if (tUser.getPhoneNumber() == null || tUser.getPhoneNumber().equals("")) {
            return  ReturnData.error("手机号不能为空");
        }
        if (tUser.getPassword() == null || tUser.getPassword().equals("")) {
            return  ReturnData.error("密码不能为空");
        }
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("phone_number",tUser.getPhoneNumber());
        TUser user = tUserMapper.selectOne(wrapper);
        if(user==null){//如果数据库没有这条数据
            return  ReturnData.error("没有该用户");
        }
        if(!tUser.getPassword().equals(user.getPassword())){//如果两个密码不一样

            return  ReturnData.error("密码错误");
        }
        String token = JWTUtils.getToken(user.getId());

        return ReturnData.ok(token);
    }
    @Resource
    RedisTemplate redisTemplate;
    /**
     * 实现注册接口的具体逻辑，相当于往表里插入数据
     *
     * @param tUser
     * @return
     */
    @Override
    public ReturnData register(TUser tUser) {
//1.判断前端数据是否合理  手机号  昵称  密码
        if (tUser.getPhoneNumber() == null || tUser.getPhoneNumber().equals("")) {
            return  ReturnData.error("手机号不能为空");
        }

        if (tUser.getPassword() == null || tUser.getPassword().equals("")) {
            return ReturnData.error("密码不能为空");
        }
        if (tUser.getNickname() == null || tUser.getNickname().equals("")) {
            return  ReturnData.error("昵称不能为空");
        }
        if (tUser.getCode() == null || tUser.getCode().equals("")) {
            return  ReturnData.error("验证码错误");
        }
        try{
            String code = redisTemplate.opsForValue().get(tUser.getEmail()).toString();//获取缓存中的验证码
            if (!tUser.getCode() .equals(code)) {//提交上来的验证码和缓存中的验证码比较,不相等就提示验证码错误
                return  ReturnData.error("验证码错误");
            }
        }catch (Exception e){
            return  ReturnData.error("验证码错误");
        }
        if (tUser.getEmail() == null || tUser.getEmail().equals("")) {
            return  ReturnData.error("邮箱不能为空");
        }
        QueryWrapper<TUser> tUserQueryWrapper = new QueryWrapper<>();
        tUserQueryWrapper.eq("phone_number",tUser.getPhoneNumber());
    //查询表里面有没有对应的手机号数据
        TUser user1 = tUserMapper.selectOne(tUserQueryWrapper);

        if(user1 != null){
            return  ReturnData.error("该手机已注册");
        }
        tUserQueryWrapper = new QueryWrapper<>();
        tUserQueryWrapper.eq("email",tUser.getEmail());
//查询表里面有没有对应的邮箱数据
        user1 = tUserMapper.selectOne(tUserQueryWrapper);
        if(user1 != null){
            return  ReturnData.error("该邮箱已注册");
        }
        tUserMapper.insert(tUser);

        return  ReturnData.ok("注册成功");
    }
    @Resource
    MyAsyncService myAsyncService;
    @Override
    public ReturnData getCode(String email) throws InterruptedException {
        //        1.先 生成一个随机验证码
        //        2.把验证码存到缓存
        //        3.把验证码发送到用户的手机或者邮箱上
        //        4.监听发送成功
        //        5.返回去给前端"验证码已发送...,请注意查收
        if (email == null || email.equals("") || !email.contains("@")) {
            return  ReturnData.error("邮箱错误");
        }

        int code = new Random().nextInt(8999) + 1000;//4位数随机数 0到8999  1
        redisTemplate.opsForValue().set(email,code,3, TimeUnit.MINUTES);//设置缓存时间为3分
        myAsyncService.sendSms(email, "【学生管理系统】", "以下是您注册学生系统的验证码为：" + code +
                ",有效期3分钟，请勿泄露给他人，避免您的个人信息泄露。");//模拟发送邮件


        return  ReturnData.ok("验证码已发送...,请注意查收");
    }
}
